package com.cos.mb.dao;

import com.cos.mb.entity.Emp;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author: COS
 * @time: 2022/5/30 11:54
 * @description:
 * 框架半成品的软件->orm 访问和操作数据库用的框架 , 把java实体类和数据库的表进行映射
 *
 * 1. mybatis-config.xml  全局配置/主配置 主要用来配置mybatis运行环境 例如 数据库链接 用户名 密码 等
 * 2. xxxMapper.xml 命名规范 实体类名Mapper.xml 配置的是接口方法和sql的映射,负责执行sql并封装数据返回结果
 *   注意:
 *   1.如果是单个参数的时候可以不写@param注解,但是多个参数的时候(基础数据类型及其包装类,String)必须要加上@param
 *         因为mapper参数的#{}中填写的值就是@param的值,mybaits以此来找对应的参数加入到sql中
 *         ,约定下不管谁多个还是单个参数都要写@param
 *   2.接口方法的返回值,会决定你的sql返回要求的是集合数据还是单个数据,如果返回的是单个对象数据,但数据库查询有多行数据,就会报错
 *          Expected one result (or null) to be returned by selectOne(), but found: 207
 *   3.如果是对象参数的时候,#{}中填写的是对象的属性名,mybatis会自己找到对应参数的值加入sql中
 *   4.如果是集合类型的参数或数据类型的参数,需要使用
 *          <foreach collection="集合的类型 list array"  open="循环开始的时候加什么东西"
 *          close="循环结束的时候加什么东西" separator="每次循环间隔加什么东西"
 *          item="设置一个接受数据的变量">
 *   5.如果是map集合的参数,#{}中填写的是map的key
 *   6.select标签中的resultType用于设置查询语句返回什么数据,如果是对象mybatis会自动为我们封装,如果是基础类型的会自动为我们转换类型
 *      如: resultType="int|string|double"
 *
 */
public interface EmpDao {
    /**
     *
     * @author: COS
     * @return:
     * @time: 2022/5/30 16:24
     * @description: 查询所有
     */
    List<Emp> getAll();

    Emp getEmpByEno(@Param("eno") int eno);
    //多个参数的时候,必须使用一个注解 @param("ename")
    List<Emp> getEmpBySexAndEname(@Param("ename") String ename,@Param("esex") String esex);
    // 返回字符串集合的数据
    List<String> getAllEmpName();
    // 所有员工的平均工资
    double getAllEmpAvgSalary();
    // 对象参数 不需要写@param注解 ,
    List<Emp> getEmpByData(Emp e);
    // 集合参数
    List<Emp> getEmpByDno(List<Integer> dnos);
    //数组
    List<Emp> getEmpByDnoByArray(Integer[] dnos);
    //map 集合
    List<Emp> getEmpByBornDates(Map<String,Object> param);
}
